//引入方法
let moduels = import.meta.glob('../pages/home/**/*.vue');
//vite里面还有个方法 eager 可以获取到所有默认导入的文件
let defaults = import.meta.globEager('../pages/home/**/*.vue');
// console.log(defaults);
//**代表home下面所有的组件,,,*代表通配符,匹配所有的vue后缀名为vue的组件 */

//目的:将读取到的modules转变成我们的route配置
//一个route的配置是这样的{path:'xxx',component:'xxx'}

//约定式路由
//1.约定所有页面都必须写在pages/home这个文件夹下面

//2.所有的页面都需要使用文件夹+index.vue这种编写方式

//
// console.log(moduels);
//声明一个空数组  用来接收逻辑之后的路由
let flatRoutes = [];
//遍历modules
for (let path in moduels) {
  // console.log(path);
  let component = moduels[path];
  let defaultsCom = defaults[path].default;
  // console.log(component);
  // console.log(defaultsCom.default);
  let reg = /^\.{2}\/pages\/home\/(.+)\/index\.vue$/;
  // console.log(path.match(reg));
  //使用正则匹配到路径
  let match = path.match(reg);
  //   因为会有空的情况,需要排除掉
  if (match) {
    //如果匹配到,声明一个对象模拟路由配置
    let route = {
      path: match[1],
      //modules中括号里的path,就是值import包括后面的路径
      component,
      meta: defaultsCom['meta'] ?? {}
    };
    // 把route push进空数组
    flatRoutes.push(route);
  }
}
// console.log(flatRoutes);

//二次处理数据,把扁平转成树形,因为需要有id和pid,现在给每个对象都添加上id和pid

flatRoutes.forEach((route) => {
  //给每个对象添加上id和pid
  let pathArr = route.path.split('/');
  // console.log(pathArr);
  //判断数组的长度 ,如果为1说明只有一个节点 就是父节点,只需要加上id就可以了
  if (pathArr.length === 1) {
    //如果是父节点 就直接加上id id就为本身的名字
    route.id = pathArr.join('');
  } else {
    //如果不是父节点 说明是子节点,需要加上id和pid
    let newPathArr = [...pathArr];
    //子节点的id是用-连接来区别父节点
    route.id = newPathArr.join('-');
    //声明Path来保存数组的第一项,用来作为path,因为路由里的子节点path没有/也没有别的名字,这样更符合子路由配置
    let path = newPathArr.pop();
    //给子路由添加pid
    route.pid = newPathArr.join('-');
    // 把处理好的path作为子路由的path
    route.path = path;
  }
  // console.log(flatRoutes);
});

//封装扁平转树形的方法
function toTree(
  data,
  currentKey = 'id',
  parentKey = 'parentKey',
  childKey = 'children'
) {
  //储存树形数据的数组
  let treeArr = [];
  //再次声明一个函数
  function recursion(data) {
    data.forEach((item) => {
      //说明这个是一个子节点
      if (item[parentKey]) {
        //找父节点
        let parent = data.find((p) => p[currentKey] === item[parentKey]);
        //判断父节点是否有children属性
        if (!parent[childKey]) {
          //添加一个children属性,并且是一个空数组
          parent[childKey] = [];
        }
        parent[childKey].push(item);
      } else {
        treeArr.push(item);
      }
    });
  }
  recursion(data);
  return treeArr;
}
//需要把扁平转树形封装的方法拿过来调用 传入参数使用
let routes = toTree(flatRoutes, 'id', 'pid');
// 导出routes;
// console.log(routes);
export default routes;
